// 手动实现浅拷贝

let obj = {
  a: 1,
  b: {
    n: 2
  }
}

// function shallowClone(obj) {
//   let newObj = {}
//   for (let key in obj) {
//     if (obj.hasOwnProperty(key)) {  // key 属性是对象显示拥有的
//       newObj[key] = obj[key]      // 对于属性 b 来说，拷贝的是内存地址 
//     }
//   }
//   return newObj
// }


// function deepClone(obj) {
//   let newObj = {}
//   for (let key in obj) {
//     if (obj.hasOwnProperty(key)) {  // key 属性是对象显示拥有的
//       if (typeof obj[key] === 'object' && obj[key] !== null) {     // obj[key] 是对象
//         newObj[key] = deepClone(obj[key]) // deepClone
//       } else {
//         newObj[key] = obj[key]      // 对于属性 b 来说，拷贝的是内存地址，如果属性 b 是一个引用类型，那么修改 newObj.b.n 也会修改 obj.b.n
//       }
//     }
//   }
//   return newObj
// }

// const res = structuredClone(obj)   // 官方打造的深拷贝
// obj.b.n = 5

// console.log(res);


function deepClone(obj) {
  return new Promise((resolve, reject) => {
    const { port1, port2 } = new MessageChannel()
    port1.postMessage(obj)
    port2.onmessage = ev => {
      resolve(ev.data)
    }
  })
}
deepClone(obj).then(res => {
  obj.b.n = 100
  console.log(res); // { a: 1, b: { n: 2 } }
})